home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Datafile PD-CD 1 Issue 2
/
PDCD-1 - Issue 02.iso
/
_utilities
/
utilities
/
003
/
motorola
/
Examples
/
as11
/
TEST
< prev
next >
Wrap
Text File
|
1993-07-13
|
11KB
|
321 lines
*TEST.AS
*
*******************************************************************************
* MCX ESR equates *
*******************************************************************************
.wait. equ 1 Wait for an event to occur
.signal. equ 2 Signal the occurence of an event
.pend. equ 3 Set a semaphore to PENDing state
.send. equ 4 Send a message to a task
.sendw. equ 5 Send a message and wait for response
.receive. equ 6 Receive a message
.deque. equ 7 Dequeue an entery from a FIFO queue
.enque. equ 8 Enqueue an entry into a FIFO queue
.resume. equ 9 Resume a suspended task
.suspend. equ 10 Suspend a task
.terminate. equ 11 Terminate a task
.execute. equ 12 Execute a task
.delay. equ 13 Delay a task for a period of time
.timer. equ 14 Set up a timer
.purge. equ 15 Purge active timer(s)
*******************************************************************************
* MESSAGE EQUATES *
*******************************************************************************
MLINK equ 0 Message link pointer
MTASK equ 2 Message's sending task
MSEMA equ 3 Message semaphore
MBODY equ 4 Start of message body
*******************************************************************************
* TEST equates *
*******************************************************************************
* REMEMBER task 1 is the CLOCK DRIVER *
T2 equ 2
T3 equ 3
T4 equ 4
T5 equ 5
SEMA_a equ 2 Semaphore that T2 waits on
SEMA_b equ 3 Semaphore that T3 waits on
SEMA_C equ 4 Semaphore that is reset by T4
SEMA_D equ 5 Semaphore that is signalled by T4 & waited by T3
TESTQ_1 equ 1 Test queue 1, used by T5 & T2
TESTQ_2 equ 2 Test queue 2, used by T4 & T3
tstmsg equ $0001 Message to be sent to task 4
savptr equ $0008
qdestn equ $0010 Address of dequeued test text string
ENDOFQ equ '$ End of queue message is dollar sign ($)
*******************************************************************************
ORG $E800
******************************************************************************
* Out of reset task 1 and 2 (and of course the null task) are the only tasks
* that are runnable. This is setup in the SYSTEM.AS file on task
* initialization. The other 3 tasks are in the idle state.
******************************************************************************
*task 2 todo's:
* 1. Delays 5 seconds.
* During this delay we will spend most of our time in the null task.
* Except for when tick timer expires.
* 2. Make task 3 runnable.
* This will not cause a task switch due to task 3 is a lower priority.
* 3. Waits on named semaphore (SEMA_a). Upon a signal from task 5.
* 4. It deques a message sent from task 5. Since task 5 is enqueing to Queue 1
* (1 x 8) queue and is a lower priority task, we will bounce back in forth
* between task 2 and 5 until complete message is sent. If Queue 1 would have
* been configured as a 4 x 2 queue, then task 2 would not have been awaken
* on the dequeue ESR until all 4 bytes were enqueued by task 5.
* 5. Signal named semaphore (SEMA_b).
* 6. Terminate self.
*****************************************************************************
tsk2 clra
clrb
ldx #5000/49
swi
FCB .delay. Delay start of task for 5 seconds. Except for
* the first time through this code, there should now
* be 2 timers in the thread. (see task 5)
ldaa #T3 set up task 3 for execution
swi
FCB .execute.
ldab #SEMA_a wait on semaphore A
swi
FCB .wait.
dqloop ldaa #TESTQ_1 dequeue from queue 1
swi
FCB .deque.
cmpa #ENDOFQ compare dequeued byte with end-of queue character
bne dqloop loop until a match is found
ldab #SEMA_b signal semaphore B
swi
FCB .signal.
clra
swi terminate self
FCB .terminate.
*******************************************************************************
*task 3 todo's:
* 1. Cause task 5 to become runnable.
* Task 5 is a lower priority task therefore no task switch.
* 2. Send a message to task 4 and wait upon the named semaphore (MSEMA).
* Once MSEMA is signalled.
* 3. Dequeue from Queue 2 (5 x 1) and put message at location $0010.
* Compare message to expected message, then wait on named semaphore (SEMA_b)
* Once SEMA_b is signalled.
* 4. Resume task 4 from the suspended state.
* Task 4 is a lower priority therefore no task switch.
* 5. Suspend task 5 and self.
* Once allowed to run due to resume ESR from task 4.
* 6. Pend the named semaphore (SEMA_c) and wait for named semaphore (SEMA_d).
* Once semaphore SEMA_d is signalled.
* 7. Terminate task 5 and self.
*******************************************************************************
tsk3 ldaa #T5 execute task 5
swi
FCB .execute.
ldd #msgT3
std tstmsg+4 set up address of char string on msg body
ldaa #T4 send message to task 4
clrb use task semaphore
ldx #tstmsg
swi
FCB .sendw.
ldaa #TESTQ_2
ldx #qdestn set up destination address
swi
FCB .deque.
ldaa #msglen
ldx #msgT3
ldy #qdestn set up source & destination addresses
cmploop ldab 0,x
cmpb 0,y
bne failT3
inx
iny
deca
bne cmploop
ldab #SEMA_b wait for semaphore B
swi
FCB .wait.
ldaa #T4 set up to resume task 4
swi
FCB .resume.
ldaa #T5 set up to suspend task 5
swi
FCB .suspend.
clra set up to suspend self
swi
FCB .suspend.
ldab #SEMA_C pend on semaphore C
swi
FCB .pend.
ldab #SEMA_D wait on semaphore D
swi
FCB .wait.
ldaa #T5 terminate task 5
swi
FCB .terminate.
clra terminate self
swi
FCB .terminate.
failT3 stop halt if matchup fails
msgT3 FCC "ABCDE"
msglen equ *-msgT3
*******************************************************************************
*task 4 todo's:
* 1. Wait on message from task 3. Strip bytes from message.
* 2. Enqueue stripped bytes into queue 2.
* 3. Signal the named semaphore (MSEMA).
* This will cause a task switch due to task 3 (waiting on MSEMA) is
* a higher priority task.
* 4. Purge the timer setup by task 5.
* Once allowed to run again due to resume from task 3.
* 6. Signal named semaphores (SEMA_c) and (SEMA_d) and allow task 3 to run.
* Since task 3 is a higher priority we will do a task switch.
* 7. Setup a 10 second timer. Cause task 2 to execute from start.
* Since task 2 is a higher priority we will do a task switch.
* Notice since we are executing task 2, which jumps to start of task 2
* we are actually starting the whole test over. But item 8. below did not
* run. However it will run as soon as the delay in task 2 is started.
* Since no other task is in the run state except task 4. We will run
* the terminate in item 8, once the delay of task 2 is started, and
* then go to the null task.
* 8. Terminate self.
*
******************************************************************************
tsk4 clra set up to receive highest priority message
swi
FCB .receive. receive the message from task 3
stx savptr save ptr to message
ldx MBODY,x get address of test text string
ldaa #TESTQ_2 enqueue to queue 2
swi
FCB .enque.
ldx savptr restore message address
ldab MSEMA,x get semaphore number to signal
swi
FCB .signal.
ldaa #T5 Purge the 10 second timer set up by
clrb task 5 and using the task semaphore.
ldx #1
swi
FCB .purge.
clra
swi
FCB .suspend. suspend self
ldab #SEMA_C signal semaphore C
swi
FCB .signal.
ldab #SEMA_D signal semaphore D
swi
FCB .signal.
ldaa #T3 resume task 3
swi
FCB .resume.
clra
clrb
ldx #10000/49 Set up a 10 second timer for self.
swi This timer should disappear when the
FCB .timer. task is terminated.
ldaa #T2 execute task 2
swi
FCB .execute.
clra terminate task 4 (self)
swi
FCB .terminate.
******************************************************************************
*task 5 todo's:
* 1. Setup a 10 second timer and cause task 4 to be runnable.
* 2. Signal named semaphore (SEMA_a). Enqueue data to Queue 1.
******************************************************************************
tsk5 clra
clrb
ldx #10000/49
swi Set up a 10 second timer for self. This timer
FCB .timer. will be purged by task 4.
ldaa #T4 execute task 4
swi
FCB .execute.
ldab #SEMA_a signal semaphore a
swi
FCB .signal.
ldy #lisT5 pointer to list of characters
enqloop ldx 0,y get next char from list
iny
ldaa #TESTQ_1 enqueue to queue 1
swi
FCB .enque.
xgdx
****(V1.4 #1) ****
cmpa #ENDOFQ look for end of queue |
bne enqloop
stop should never get here.
lisT5 FCC "ZYX$"
*******************************************************************************
* Now set up the starting addresses in the TCB *
*******************************************************************************
* Be sure to download SYSTEM.S19 into the EVM before loading the TEST.S19
* file. This will assure that the starting addresses will be overlayed into
* the task control blocks properly. These addresses are set up to the task
* number in SYSTEM.AS file and therfore are not runnable.
******************************************************************************
ORG $E014
FDB tsk2
ORG $E01B
FDB tsk3
ORG $E022
FDB tsk4
ORG $E029
FDB tsk5